package com.example.order;

import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * @Author: ft
 * @Date:2025/8/18
 * @Description: 相关单据：
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableFeignClients
public class OrderApplication {

    public static void main(String[] args) {
        org.springframework.boot.SpringApplication.run(OrderApplication.class, args);
        System.out.println("Order Application started successfully!");
    }


    /**
     * 监听nacos配置文件的变化
     * ApplicationRunner applicationRunner() 方法只会在 Spring Boot 应用启动后执行一次，
     * NacosConfigManager nacosConfigManager 会从spring的容器中取
     * 如果需要监听配置文件的变化，可以使用 NacosConfigManager 的相关方法
     * 例如：nacosConfigManager.getConfigService().addListener(...)
     * 如果需要在应用启动时执行一些初始化逻辑，可以在这里添加
     * 例如：加载一些默认配置或进行一些必要的初始化操作
     * 注意：如果需要监听配置文件的变化，建议使用 NacosConfigManager 的
     * `getConfigService().addListener(...)` 方法来注册监听器。
     */
    @Bean
    ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager) {
        System.out.println("OrderApplication.applicationRunner() called");
        return args -> {
            // 这里可以添加一些初始化逻辑
            nacosConfigManager.getConfigService().addListener("service-order.properties", "DEFAULT_GROUP",

                    new Listener() {
                        /**
                         * 获取监听器的执行器
                         * 如果需要异步执行监听器的回调方法，可以返回一个 Executor 实例
                         * 如果不需要异步执行，可以返回 null
                         * 注意：如果返回 null，则监听器的回调方法会在调用线程中执行，
                         * 这可能会导致阻塞，特别是在回调方法中执行耗时操作时。
                         * 因此，建议在需要异步执行的情况下返回一个 Executor 实例。
                         * @return
                         */
                        @Override
                        public Executor getExecutor() {
                            return Executors.newFixedThreadPool(5);
                        }

                        @Override
                        public void receiveConfigInfo(String s) {
                            System.out.println("s = " + s);
                        }
                    }
            );
        };
    }
}